
#librairies tm et slam
library(tm)
library(slam)
 #CMD SHLIB supp_script.c
dyn.load("supp_script.so")
extract_text<-function(x){
# x un text dont on souhaite extraire le texte

	#concaténation de toutes les lignes en une seule
	x<-PlainTextDocument(paste(x,collapse=""))

	#suppression des scripts

	#version 1 : pb de débordement de pile 
	#(appels récursifs important du fait de l'expression régulière complexe)
	#x<-gsub("(<script)((?!script>).)*(</script>)"," ",x,perl=TRUE,ignore.case=TRUE)

	#version 2 : script C avec parcours linéaire de la chaîne
	x<-.C("supp_script",as.character(x))

	#suppression des balise HTML
	x<-gsub("<[^<]*>"," ",x,perl=TRUE,ignore.case=TRUE)

	#suppression d'autres caractères spéciaux
	x<-gsub("\\t|\\f|&amp;|<!--|&copy;|&egrave;|&quot;|&nbsp;","",x,perl=TRUE,ignore.case=TRUE)

	return(PlainTextDocument(x))
}


#renvoie la classe du voisin
dir_classe <- function(nom){
  rep=""
  if(nom>=1 && nom<=150)
    rep="accueil"
  else
    if(nom>=151 && nom<=300)
      rep="commerce"
    else
      if(nom>=301 && nom<=450)
        rep="home"
      else
        if(nom>=451 && nom<=600)
          rep="blog"
        else
          if(nom>=601 && nom<=750)
            rep="FAQ"
          else
            if(nom>=751 && nom<=900)
              rep="liste"
            else
              if(nom>=901 && nom<=1051)
                rep="recherche"
  return(rep)
}



#créé le DTM
creer_matrice<-function(corpus){
  
  corpus1 = tm_map(corpus,removeWords,stopwords())
  corpus2 = tm_map(corpus1,removePunctuation)

  matrice1 = DocumentTermMatrix(corpus2)
  matrice = removeSparseTerms(matrice1, 0.9)
  dimnames(matrice)  
  return(matrice)
}


ecrire_fichier <- function(matrice, nom){

  write.table(as.matrix(matrice), nom, quote = FALSE)

}

lire_fichier <- function(nom){

  return(read.table(nom, header = TRUE))
  
}


#créé le corpus documentaire, calcule le DTM et le stoque dans un fichier
creerCorpus <- function (rep)
  {
    ls <- dir(rep)
    final <- Corpus(DirSource(paste(paste(rep,"/",sep=""),ls[1],sep="")),readerControl=list(reader=readPDF))

    for(i in 2:length(ls))
     final <- c(final, Corpus(DirSource(paste(paste(rep,"/",sep=""),ls[i],sep="")),readerControl=list(reader=readPDF)))

    final <- tm_map(final, extract_text)
    final <- creer_matrice(final)
    ecrire_fichier(final, "DTM_CORPUS")
    return (final)
    
  }



#on passe à l'étape de traiement.

#traiter le texte en entrée
#le texte et sous forme de
#vecteur de caractères
traiter <- function (txt)
  {
    txt2 <- PlainTextDocument(txt)
    txt2 <- extract_text(txt2)
    return(txt2)
  }



#Calcul des K plus proches

#distance euclidienne entre la ligne i
#du datafame n et le vecteur vect
distance<- function(i, vect, n)
  {
    v1 = n[i,2:(ncol(n)-1)]
    v2 = n[i,2:(ncol(n)-1)]
    return(sum((v1-v2)^2))
  }

#distance globale sur le DTM n du vecteur a tester
distanceGlo<- function(n,vect)
  {
    return(sapply(1:1050,distance, vect, n))
  }

#renvoie un vecteur contenant les indices des k plus proches voisins
#de vect 
KplusProches<- function(k,n,vect)
  {
    aux = distanceGlo(n,vect)
    res = sort(aux,index.return = T)$ix
   # iter = res[1:k+1]
    #res2 = res[0:k+1]
    return(res[1])
  }



#classe le nouveaux texte
classer <- function (txt)
  {
    DATA <- lire_fichier("DTM_CORPUS")
    txt2 <- traiter(txt)
    vect <- termFreq(txt2, control = list(dictionarry = colnames(DATA, prefix = "")))
    #affiche la classe de l'objet txt
   ligne <- KplusProches(1,DATA, vect)
   indice = dir_classe(DATA[ligne, 1])
   return(42)
  }


 
